package com.example.werewolf.todo;

import lombok.Data;

import java.util.*;

/**
 * 游戏状态模型
 * 代表当前游戏的完整状态快照。
 * 这个类会被传递给 AIPlayerAgent，作为其决策的依据。
 */
@Data
public class GameState {

    // ========== 核心游戏属性 ==========

    /**
     * 当前游戏阶段 (e.g., "FIRST_NIGHT", "DAY_ONE_POLICE", "DAY_ONE_VOTING")
     */
    private String currentPhase;

    /**
     * 所有玩家的列表 (按编号排序 1-8)
     * 包含已死亡的玩家。
     */
    private List<AIPlayerAgent> allPlayers;

    /**
     * 当前存活玩家的ID列表 (e.g., ["1", "3", "4", "5", "6", "8"])
     */
    private List<String> alivePlayers;

    /**
     * 当前已死亡玩家的ID列表 (e.g., ["2", "7"])
     */
    private List<String> deadPlayers;

    /**
     * 警长玩家的ID (如果警徽流失则为 null)
     */
    private String sheriffId;

    // ========== 夜晚行动结果 ==========

    /**
     * 本夜被狼人刀杀的玩家ID (如果女巫没救或救的是别人)
     */
    private String killedByWerewolf;

    /**
     * 本夜被女巫毒杀的玩家ID
     */
    private String killedByWitch;

    /**
     * 本夜被女巫救活的玩家ID
     */
    private String savedByWitch;

    // ========== 白天行动结果 ==========

    /**
     * 本日白天被投票放逐的玩家ID
     */
    private String exiledPlayer;

    /**
     * 上警玩家的ID列表
     */
    private List<String> policeCandidates;

    /**
     * 警长投票结果 (玩家ID -> 票数)
     */
    private Map<String, Integer> sheriffVoteResults;

    /**
     * 放逐投票结果 (玩家ID -> 票数)
     */
    private Map<String, Integer> exileVoteResults;

    // ========== 历史记录 ==========

    /**
     * 关键历史事件列表 (供AI参考)
     * 例如: "首夜: 2号死亡(未被救), 预言家查验5号为好人", "第一天: 投票放逐7号(狼人)"
     */
    private List<String> historyEvents;

    // ========== 构造函数 ==========

    public GameState() {
        this.allPlayers = new ArrayList<>();
        this.alivePlayers = new ArrayList<>();
        this.deadPlayers = new ArrayList<>();
        this.policeCandidates = new ArrayList<>();
        this.sheriffVoteResults = new HashMap<>();
        this.exileVoteResults = new HashMap<>();
        this.historyEvents = new ArrayList<>();
    }

    // ========== 核心方法 ==========

    /**
     * 获取当前游戏阶段
     */
    public String getCurrentPhase() {
        return currentPhase;
    }

    public void setCurrentPhase(String currentPhase) {
        this.currentPhase = currentPhase;
    }

    /**
     * 获取存活玩家列表
     */
    public List<String> getAlivePlayers() {
        return new ArrayList<>(alivePlayers); // 返回副本，防止外部修改
    }

    public void setAlivePlayers(List<String> alivePlayers) {
        this.alivePlayers = new ArrayList<>(alivePlayers);
    }

    /**
     * 获取历史事件摘要 (用于构建Prompt)
     */
    public String getHistorySummary() {
        if (historyEvents.isEmpty()) {
            return "暂无历史事件。";
        }
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < historyEvents.size(); i++) {
            sb.append((i + 1)).append(". ").append(historyEvents.get(i)).append("\n");
        }
        return sb.toString();
    }

    public void addHistoryEvent(String event) {
        this.historyEvents.add(event);
    }

    // ... 为其他所有属性添加 getter 和 setter 方法 ...

    // ========== 辅助方法 ==========

    /**
     * 根据玩家ID获取其角色 (用于 GameEngine 内部逻辑)
     */
    public String getRoleByPlayerId(String playerId) {
        return allPlayers.stream()
                .filter(p -> p.getPlayerId().equals(playerId))
                .findFirst()
                .map(AIPlayerAgent::getRole)
                .orElse("未知");
    }

    /**
     * 检查游戏是否结束
     */
    public boolean isGameOver() {
        long wolfCount = allPlayers.stream()
                .filter(p -> "狼人".equals(p.getRole()) && p.isAlive())
                .count();
        long goodCount = allPlayers.stream()
                .filter(p -> !"狼人".equals(p.getRole()) && p.isAlive())
                .count();

        // 狼人胜利条件
        if (wolfCount == 0) {
            return true; // 好人胜利
        }
        if (wolfCount >= goodCount) {
            return true; // 狼人胜利
        }

        return false;
    }
}
